package com.wjm.shootgame.shoot;

import javax.swing.*;
import java.awt.*;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

/*
* 战场类
* */
public class World extends JPanel {
    public static final int WIDTH=512;
    public static final int HEIGHT=768;
    public Hero hero = new Hero();
    public Bullet[] bullet = {};
    public  Sky sky = new Sky();

//    public BigAirplane bigAirplane;
//    public Airplane airplane;
//    public Bee bee;
    //创建敌人数组，数据类型为FlyingObject，用来存放bee/bigAirplane/airplane对象
    public FlyingObject[] enemies = {};


    public void action(){

        //Java中的定时器
        Timer timer = new Timer();
        //调用时间表
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                //每调用一次这个方法就存一个敌机对象到enemies[]数组中
                enterEnemies();
                //每调用一次这个方法就会有子弹存入到bullet[]数组中
                shootAction();
                moveAction();
            }
        },10,10);//第一个delay（参数）100ms是表示schedule执行100毫秒后在执行run方法，后面一个period参数表示每100毫秒执行一次run方法

    }

    /**
     * 这是一个将敌机对象存入enemies[]数组的方法
     */
    int enemyTime = 0;
    private void enterEnemies(){
        enemyTime++;
        //if语句用于控制飞机的生成速度
        if (enemyTime%40==0){//就是每10*40毫秒添加一个敌机
            //接收createEnemy（）方法传过来的对象
            FlyingObject f = createEnemy();
            //对enemies[]数组进行扩容每次长度加1
            enemies = Arrays.copyOf(enemies,enemies.length+1);
            //将获取的对象，每次都存入数组的最后一个位置
            enemies[enemies.length-1] = f;
        }

    }

    /**
     * 这是一个将英雄射出的子弹存入到bullet[]数组的方法
     */
    int bulletsTime = 0;
    private void shootAction(){
        bulletsTime++;
        if (bulletsTime%30 ==0){
            //接收英雄类射出的子弹数组
            Bullet[] b = hero.shootBullets();
            //对bullet数据进行扩容，扩容长度为接收到的长度
            bullet = Arrays.copyOf(bullet,b.length+bullet.length);
            //将接收到的子弹数组b[]的元素复制到bullet[]数组的尾部
            //srcPos:0表示从b[]数组的0元素开始复制，desPos表示从bullet[]数组哪个位置开始放，最后一个参数表示复制的长度
            System.arraycopy(b,0,bullet,bullet.length-b.length, b.length);
        }
    }

    /**
     * 封装了飞行物移动的行为
     */
    private void moveAction(){
        //调用天空的move方法
        sky.move();
        //调用敌机的移动方法
        for (int i=0;i<enemies.length;i++){
            enemies[i].move();
        }
        //调用子弹的move方法
        for (int i=0;i<bullet.length;i++){
            bullet[i].move();
        }
    }


    /**
     * 这是一个生成敌机的方法
     * @return 返回敌机的对象
     */
    public FlyingObject createEnemy(){
        //生成0到20之间的随机数
        Random random = new Random();
        int a = random.nextInt(20);
        //自己规定：如果a在[0,5]则返回bee对象，如果a在[5,13]则返回airplane对象，如果a在[13,20]则返回bigAirplane对象
        if (a<=5){
            return new Bee();
        }else if (a<=13){
            return new Airplane();
        }else {
            return new BigAirplane();
        }
    }


    /**
     * 重写父类(Jcomponent)方法,是一个画画的功能
     * @param g 相当于是画笔
     */
    @Override
    public void paint(Graphics g) {
        //画天空的图片
        sky.paintImage(g);
        //画英雄机
        hero.paintImage(g);
        //画敌机
        for (int i=0;i<enemies.length;i++){
            enemies[i].paintImage(g);
        }
        //画子弹
        for (int i=0;i<bullet.length;i++){
            bullet[i].paintImage(g);
        }
        //刷新
        repaint();
    }

    public static void main(String[] args) {
        //设置画框对象
        JFrame jFrame = new JFrame("java基础小项目-飞机大作战");
        //设置画布对象，world继承了jpanel
        World world = new World();
        //将画布添加到画框中
        jFrame.add(world);

        //设置画布的size
        jFrame.setSize(WIDTH,HEIGHT);
        //设置窗口可见性
        jFrame.setVisible(true);
        //设置窗口居中
        jFrame.setLocationRelativeTo(null);
        //设置窗口关闭方式（关闭窗口同时结束程序）
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置画面优先级（总是显示在最上面）
        jFrame.setAlwaysOnTop(true);

        world.action();
    }
}
